package com.yiwyn;


import ws.schild.jave.*;
import ws.schild.jave.encode.AudioAttributes;
import ws.schild.jave.encode.EncodingAttributes;
import ws.schild.jave.encode.VideoAttributes;

import java.io.File;

/**
 * @author tomatocc
 * @email 553866242@qq.com
 * @desc
 */
public class Jave2 {


    public static void main(String[] args) {
        // 压缩前文件路径
        File source = new File("C:\\Users\\Yiwyn\\Desktop\\video(1).mp4");
        // 压缩后的文件路径
        File target = new File("C:\\Users\\Yiwyn\\Desktop\\video_target.mp4");
        compre(source, target, 50);
    }

    /**
     * 视频压缩
     *
     * @param source 源文件
     * @param target 目标文件
     * @param rate   压缩比
     */
    public static void compre(File source, File target, Integer rate) {
        try {
            System.out.println("begin");
            long start = System.currentTimeMillis();

            // 音频编码属性配置
            AudioAttributes audio = new AudioAttributes();
            audio.setCodec("libmp3lame");
            // 设置音频比特率,单位:b (比特率越高，清晰度/音质越好，当然文件也就越大 56000 = 56kb)
            audio.setBitRate(new Integer(56_000));
            // 设置重新编码的音频流中使用的声道数（1 =单声道，2 = 双声道（立体声））
            audio.setChannels(1);
            // 采样率越高声音的还原度越好，文件越大
            audio.setSamplingRate(new Integer(44100 / 2));

            // 视频编码属性配置
            VideoAttributes video = new VideoAttributes();
            // 设置编码
            video.setCodec("mpeg4");
            //设置音频比特率,单位:b (比特率越高，清晰度/音质越好，当然文件也就越大 5600000 = 5600kb)
            video.setBitRate(new Integer(5_600_000 / rate));
            // 设置视频帧率（帧率越低，视频会出现断层，越高让人感觉越连续）,这里 除1000是为了单位转换
            video.setFrameRate(new Integer(15));


            // 编码设置
            EncodingAttributes attr = new EncodingAttributes();
            attr.setInputFormat("mp4");
            attr.setAudioAttributes(audio);
            attr.setVideoAttributes(video);

            // 设置值编码
            Encoder ec = new Encoder();
            ec.encode(new MultimediaObject(source), target, attr);


            System.out.println("end");
            long end = System.currentTimeMillis();

            System.out.println("压缩前大小： " + source.length() + " 压缩后大小：" + target.length());

            System.out.println("压缩耗时： " + (end - start));

        } catch (EncoderException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }

    }
}

